package top.ytazwc.improve.factory;

import top.ytazwc.improve.adapter.ICacheAdapter;
import top.ytazwc.improve.utils.ClassLoaderUtils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @author 花木凋零成兰
 * @title JDKInvocationHandler
 * @date 2024/4/28 17:27
 * @package top.ytazwc.improve.factory
 * @description 工厂被代理实现后的核心处理类
 */
public class JDKInvocationHandler implements InvocationHandler {

    // 适配器对象 统一接口
    // 用于执行代理对象方法的调用
    private ICacheAdapter iCacheAdapter;

    // 有参构造 注入缓存适配器实例
    public JDKInvocationHandler(ICacheAdapter iCacheAdapter) {
        this.iCacheAdapter = iCacheAdapter;
    }

    /**
     * InvocationHandler的invoke方法实现，用于在代理对象的方法被调用时进行处理。
     * @param proxy  代理对象实例。
     * @param method 被调用的方法。
     * @param args   被调用方法的参数。
     * @return       被调用方法的返回值。
     * @throws Throwable 当方法调用失败时，可能会抛出异常。
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 获取iCacheAdapter对象中与调用方法同名的方法
        // 使用ClassLoaderUtils.getClazzByArgs(args)来确定方法参数的具体类型
        Method cacheMethod =
                ICacheAdapter.class.getMethod(method.getName(), ClassLoaderUtils.getClazzByArgs(args));
        // 通过反射调用iCacheAdapter中的相应方法，并传入方法参数args。
        // cacheMethod.invoke()
        // 第一个参数是方法所在的对象 即cacheAdapter，
        // 第二个参数是方法的参数 即args。
        return cacheMethod.invoke(iCacheAdapter, args);
    }
}
